package com.powernode.config;

import cn.hutool.core.util.ObjectUtil;
import com.powernode.constant.AuthConstants;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;

/**
 * 分布式架构Spring Cloud中如果想通过Feign接口的调用隐式的传递一些参数，
 * 比如 用户ID、用户名称、身份认证等问题，就需要通过实现RequestInterceptor拦截器来实现。
 * 由于分布式架构中每一个业务模块都是需要验证请求的身份信息，所以通过feign拦截器来实现请求身份的认证。
 */
@Component
public class FeignInterceptor implements RequestInterceptor {

    /**
     * 将当前请求的Authorization头复制到RequestTemplate中，用于微服务间的调用
     * 如果当前请求的Authorization头不存在，则使用预设的Token
     *
     * @param requestTemplate 待填充的请求模板，用于微服务间的调用
     */
    @Override
    public void apply(RequestTemplate requestTemplate) {
        // 获取当前请求的属性
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        // 检查当前请求属性是否不为空
        if (ObjectUtil.isNotNull(requestAttributes)) {
            // 获取当前的HttpServletRequest
            HttpServletRequest request = requestAttributes.getRequest();
            // 检查HttpServletRequest是否不为空
            if (ObjectUtil.isNotNull(request)) {
                // 获取当前请求的Authorization头
                String authorization = request.getHeader(AuthConstants.AUTHORIZATION);
                // 将当前请求的Authorization头复制到RequestTemplate中
                requestTemplate.header(AuthConstants.AUTHORIZATION, authorization);
                return;
            }
        }
        // 如果当前请求的Authorization头不存在，则使用预设的Token
        requestTemplate.header(AuthConstants.AUTHORIZATION, AuthConstants.BEARER + "7cb8a041-bf93-4143-88b5-70c969482bfd");

    }
}